﻿/** websocket对象 */
let websocket = null;
/**是否链接到Socket */
let IsOpen = false;

/**
 * 获取Socket,null表示浏览器不支持
 * @param {string} url 链接 示例"ws://127.0.0.1:8888","wss://127.0.0.1:8888"
 * @param {Function} MessageEvent 服务端发送消息时回调函数 带有一个参数evt.data
 * @param {Function} OpenEvent 成功链接到服务端的回调函数 无参
 * @param {Function} CloseEvent 关闭链接时回调函数 无参
 * @param {Function} ErrorEvent 出现异常时回调函数 带有一个参数evt
 */
function GetSocket(url, MessageEvent = null, OpenEvent = null, CloseEvent = null, ErrorEvent = null) {
    let socket
    if ('WebSocket' in window) {
        socket = new WebSocket(url);
    } else if ('MozWebSocket' in window) {
        socket = new MozWebSocket(url);
    } else {
        alert('不支持当前浏览器！');
        socket = null
        return socket
    }
    //注册各类回调
    socket.onopen = function (evt) {
        IsOpen = true
        if (OpenEvent == null) {
            console.log("服务端链接成功!")
        } else {
            OpenEvent();
        }
    }
    socket.onclose = function (evt) {
        socket = null
        IsOpen = false
        if (CloseEvent == null) {
            console.log("服务端链接关闭!")
        } else {
            CloseEvent();
        }
    }
    socket.onerror = function (evt) {
        if (ErrorEvent == null) {
            console.log("链接Socket出现异常!")
        } else {
            ErrorEvent(evt);
        }
    }
    socket.onmessage = function (evt) {//接收服务端数据返回
        if (MessageEvent == null) {
            console.log("服务端消息:  " + evt.data)
        } else {
            MessageEvent(evt.data);
        }
    }
    return socket
}

/**
 * 开启默认的Socket(websocket)
 * @param {string} url 链接 示例"ws://127.0.0.1:8888","wss://127.0.0.1:8888"
 * @param {Function} MessageEvent 服务端发送消息时回调函数 带有一个参数evt.data
 * @param {Function} OpenEvent 成功链接到服务端的回调函数 无参
 * @param {Function} CloseEvent 关闭链接时回调函数 无参
 * @param {Function} ErrorEvent 出现异常时回调函数 带有一个参数evt
 */
function SocketStart(url, MessageEvent = null, OpenEvent = null, CloseEvent = null, ErrorEvent = null) {
    websocket = GetSocket(url, MessageEvent, OpenEvent, CloseEvent, ErrorEvent)
}

/**
 * 发送消息(对默认的socket发送消息--websocket)
 * @param {string|ArrayBuffer} message 消息信息 (byte[]或者字符串)
 */
function SocketSend(message) {
    if (!IsOpen) {
        return
    }
    websocket.send(message);
}

/**
 * 关闭链接(关闭默认的socket发送消息--websocket)
 */
function SocketClose() {
    if (!IsOpen) {
        return
    }
    websocket.close();
}
